package com.george.order.loadbalance;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @title: RoundRobinLoadBalancer.java
 * @description: 负载均衡算法-轮询（Round Robin）
 * @author: George.Dong
 * @date: 2024/5/30 11:35
 */
public class RoundRobinLoadBalancer {

    /**
     * 服务器列表
     */
    private List<String> servers;

    /**
     * 当前索引，用于追踪下一个要选择的服务器
     */
    private AtomicInteger currentIndex = new AtomicInteger(-1);

    /**
     * 构造函数，初始化服务器列表。
     *
     * @param servers 服务器列表，不能为null
     */
    public RoundRobinLoadBalancer(List<String> servers) {
        this.servers = servers;
    }

    /**
     * 获取下一个要处理请求的服务器。
     * 这个方法是同步的，以避免多线程环境下的并发问题
     *
     * @return {@link String} 返回下一个可用的服务器实例
     */
    public synchronized String getNextServer() {
        // 循环索引，以支持服务器列表的无限轮询
        int index = currentIndex.incrementAndGet() % servers.size();
        // 通过绝对值确保索引总是非负数
        return servers.get(Math.abs(index));
    }

    public static void main(String[] args) {
        // 初始化服务器列表
        List<String> servers = Arrays.asList("Server1", "Server2", "Server3");
        // 创建负载均衡器实例
        RoundRobinLoadBalancer lb = new RoundRobinLoadBalancer(servers);

        // 模拟10个请求，并打印出处理每个请求的服务器名称
        for (int i = 0; i < 10; i++) {
            String clientIp = "192.168.0.13" + i;
            System.out.println("Client IP: " + clientIp + " -> Server: " + lb.getNextServer());
        }
    }
}

